a11y: Solved leak on gtk_widget_accessible_get_description
authorAlejandro Piñeiro <apinheiro@igalia.com>
Tue, 11 Sep 2012 19:17:22 +0000 (21:17 +0200)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 12 Sep 2012 19:15:59 +0000 (21:15 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=643611

gtk/a11y/gtkwidgetaccessible.c

index c386eb3ef9c63a570bf5c7212488a0fb2b7ddaf3..b37232a510b055f4f8fc4784d4670b19cccb719d 100644 (file)
@@ -24,6 +24,8 @@
 #include "gtkwidgetaccessible.h"
 #include "gtknotebookpageaccessible.h"
 
+#define TOOLTIP_KEY "tooltip"
+
 extern GtkWidget *_focus_widget;
 
 
@@ -106,6 +108,16 @@ gtk_widget_accessible_focus_event (AtkObject *obj,
   atk_object_notify_state_change (focus_obj, ATK_STATE_FOCUSED, focus_in);
 }
 
+static void
+gtk_widget_accessible_update_tooltip (GtkWidgetAccessible *accessible,
+                                      GtkWidget *widget)
+{
+  g_object_set_data_full (G_OBJECT (accessible),
+                          TOOLTIP_KEY,
+                          gtk_widget_get_tooltip_text (widget),
+                          g_free);
+}
+
 static void
 gtk_widget_accessible_initialize (AtkObject *obj,
                                   gpointer   data)
@@ -123,6 +135,8 @@ gtk_widget_accessible_initialize (AtkObject *obj,
 
   GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_WIDGET;
   obj->role = ATK_ROLE_UNKNOWN;
+
+  gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (obj), widget);
 }
 
 static const gchar *
@@ -137,7 +151,7 @@ gtk_widget_accessible_get_description (AtkObject *accessible)
   if (accessible->description)
     return accessible->description;
 
-  return gtk_widget_get_tooltip_text (widget);
+  return g_object_get_data (G_OBJECT (accessible), TOOLTIP_KEY);
 }
 
 static AtkObject *
@@ -475,7 +489,11 @@ gtk_widget_accessible_notify_gtk (GObject    *obj,
       state = ATK_STATE_HORIZONTAL;
       value = (gtk_orientable_get_orientation (orientable) == GTK_ORIENTATION_HORIZONTAL);
     }
-  else
+  else if (g_strcmp0 (pspec->name, "tooltip-text") == 0)
+    {
+      gtk_widget_accessible_update_tooltip (GTK_WIDGET_ACCESSIBLE (atk_obj),
+                                            widget);
+    }
     return;
 
   atk_object_notify_state_change (atk_obj, state, value);